home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
c
/
bplus25a.zip
/
BPLUS.C
next >
Wrap
Text File
|
1991-06-14
|
26KB
|
1,004 lines
/********************************************************************/
/* */
/* BPLUS file indexing program - Version 2.5 */
/* */
/* A "shareware program" */
/* */
/* */
/* Copyright (C) 1987-1991 by */
/* */
/* Hunter and Associates */
/* 7900 Edgewater Drive */
/* Wilsonville, Oregon 97070 */
/* (503) 694 - 1449 */
/* */
/********************************************************************/
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <process.h>
#include <sys\types.h> /* delete this line for Turbo C */
#include <sys\stat.h>
#include <string.h>
#include "bplus.h"
/* macros, constants, data types */
#define NULLREC (-1L)
#define FREE_BLOCK (-2)
#define ENT_ADR(pb,off) ((ENTRY*)((char*)((pb)->entries) + off))
#define ENT_SIZE(pe) strlen((pe)->key) + 1 + 2 * sizeof(RECPOS)
#define BUFDIRTY(j) (mci->cache[j].dirty)
#define BUFHANDLE(j) (mci->cache[j].handle)
#define BUFBLOCK(j) (mci->cache[j].mb)
#define BUFCOUNT(j) (mci->cache[j].count)
#define CB(j) (pci->pos[j].cblock)
#define CO(j) (pci->pos[j].coffset)
#define TRUE 1
#define FALSE 0
/* BPLUS uses the library routine */
/* memmove which must be used with */
/* Turboc 1.5, 2.0, Quick C and */
/* MS C 5.0 and 5.1 */
/* #define memmove memcpy */ /* Use this macro for Microsoft C4.0 */
/* declare some global variables */
IX_DESC *pci;
IX_BUFFER bt_buffer;
IX_BUFFER *mci = &bt_buffer;
BLOCK *block_ptr;
BLOCK *spare_block;
int cache_ptr = 0;
int cache_init = 0;
int split_size = IXB_SPACE;
int comb_size = (IXB_SPACE/2);
void pascal error(int, long);
void pascal read_if(long, char *, int);
void pascal write_if(int, long, char *, int);
void pascal reset_buffers(IX_DESC *);
int pascal creat_if(char *);
int pascal open_if(char *);
void pascal close_if(int);
void pascal update_block(void);
void pascal init_cache(void);
int pascal find_cache(RECPOS);
int pascal new_cache(void);
void pascal load_cache(RECPOS);
void pascal get_cache(RECPOS);
void pascal retrieve_block(int, RECPOS);
int pascal prev_entry(int);
int pascal next_entry(int);
void pascal copy_entry(ENTRY *, ENTRY *);
int pascal scan_blk(int);
int pascal last_entry(void);
void pascal write_free( RECPOS, BLOCK *);
RECPOS pascal get_free(void);
int pascal find_block(ENTRY *, int *, int *);
void pascal movedown(BLOCK *, int, int);
void pascal moveup(BLOCK *, int, int);
void pascal ins_block(BLOCK *, ENTRY *, int);
void pascal del_block(BLOCK *, int);
void pascal split(int, ENTRY *, ENTRY *);
void pascal ins_level(int, ENTRY *);
int pascal insert_ix(ENTRY *, IX_DESC *);
int pascal find_ix(ENTRY *, IX_DESC *, int);
int pascal combineblk(RECPOS, int);
void pascal replace_entry(ENTRY *);
void print_blk(BLOCK *);
/* file I/O for B-PLUS module */
void pascal error(j, l)
int j;
long l;
{
static char *msg[3] = {"ERROR - CANNOT OPEN/CLOSE FILE",
"ERROR WHILE READING FILE",
"ERROR WHILE WRITING FILE"};
printf("\n %s - Record Number %ld\n", msg[j], l);
exit(1);
} /* error */
void pascal read_if(start, buf, nwrt)
long start;
char *buf;
int nwrt;
{
long err;
err = start - lseek(pci->ixfile, start, SEEK_SET);
if (err == 0) err = nwrt - read(pci->ixfile, buf, nwrt);
if (err != 0) error(1, start);
} /* read_if */
void pascal write_if(handle, start, buf, nwrt)
int handle;
long start;
char *buf;
int nwrt;
{
long err;
err = start - lseek(handle, start, SEEK_SET);
if (err == 0) err = nwrt - write(handle, buf, nwrt);
if (err != 0) error(2, start);
} /* write_if */
int pascal creat_if(fn)
char *fn;
{
int ret;
ret = open(fn,O_RDWR|O_CREAT|O_TRUNC|O_BINARY,S_IWRITE);
if (ret < 0) error(0,0L);
return (ret);
} /* creat_if */
int pascal open_if(fn)
char *fn;
{
int ret;
ret = open(fn,O_RDWR|O_BINARY);
if (ret < 1) error(0,0L);
return (ret);
} /* open_if */
void pascal close_if(handle)
int handle;
{
if(close(handle) < 0) error(2,0L);
} /* close_if */
int cdecl open_index(name, pix, dup)
char *name;
IX_DESC *pix;
int dup;
{
pci = pix;
pci->ixfile = open_if(name);
pci->root_dirty = FALSE;
pci->duplicate = dup;
read_if(0L,(char *)&(pix->root), (sizeof(BLOCK) + sizeof(IX_DISK)));
if (!cache_init)
{
init_cache();
cache_init = 1;
}
return ( IX_OK );
} /* open_index */
void cdecl buffer_flush(pix)
IX_DESC *pix;
{
int i;
if (pix->root_dirty)
{
write_if(pix->ixfile, 0L,(char *)&(pix->root),
(sizeof(BLOCK) + sizeof(IX_DISK)));
pix->root_dirty = FALSE;
}
for (i = 0; i < NUM_BUFS; i++)
{
if ( (BUFHANDLE(i) == pix->ixfile) && BUFDIRTY(i) )
{
write_if(BUFHANDLE(i),
BUFBLOCK(i).brec,
(char *) &BUFBLOCK(i),
sizeof(BLOCK));
BUFDIRTY(i) = FALSE;
}
}
}
void pascal reset_buffers(pix)
IX_DESC *pix;
{
int i;
for (i = 0; i < NUM_BUFS; i++)
if (BUFHANDLE(i) == pix->ixfile) BUFBLOCK(i).brec = NULLREC;
}
int cdecl close_index(pix)
IX_DESC *pix;
{
int ret = IX_OK;
buffer_flush(pix);
reset_buffers(pix);
close_if(pix->ixfile);
return( ret );
} /* close_index */
int cdecl make_index(name, pix, dup)
char *name;
IX_DESC *pix;
int dup;
{
pci = pix;
pci->ixfile = creat_if(name);
pci->duplicate = dup;
pci->root_dirty = FALSE;
pci->dx.nl = 1;
pci->dx.ff = NULLREC;
pci->level = 0;
CO(0) = -1;
CB(0) = 0L;
pci->root.brec = 0L;
pci->root.bend = 0;
pci->root.p0 = NULLREC;
write_if(pci->ixfile, 0L,(char *)&(pix->root),
(sizeof(BLOCK) + sizeof(IX_DISK)));
if (!cache_init)
{
init_cache();
cache_init = 1;
}
return ( IX_OK );
} /* make_index */
/* cache I/O for BPLUS */
void pascal update_block()
{
if (block_ptr == &(pci->root)) pci->root_dirty = TRUE;
else BUFDIRTY(cache_ptr) = TRUE;
} /* update_block */
void pascal init_cache()
{
register int j;
for (j = 0; j < NUM_BUFS; j++)
{ BUFDIRTY(j) = 0;
BUFCOUNT(j) = 0;
BUFBLOCK(j).brec = NULLREC;
}
} /* init_cache */
int pascal find_cache(r)
RECPOS r;
{
register int j;
for (j = 0; j < NUM_BUFS; j++)
{
if((BUFBLOCK(j).brec == r) && (BUFHANDLE(j) == pci->ixfile))
{ cache_ptr = j;
return (1);
} }
return (-1);
} /* find_cache */
int pascal new_cache()
{
register int i;
i = (cache_ptr + 1) % NUM_BUFS;
if (BUFDIRTY(i)) write_if(BUFHANDLE(i),
BUFBLOCK(i).brec,
(char *) &BUFBLOCK(i),
sizeof(BLOCK));
BUFHANDLE(i) = pci->ixfile;
BUFDIRTY(i) = 0;
return (i);
} /* new_cache */
void pascal load_cache(r)
RECPOS r;